/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;
import ws.CondicaoCompra;
import ws.CondicaoCompraParcela;
import ws.CotacaoPreco;
import ws.CotacaoPrecoMercadorias;
import ws.PedidoCompra;
import ws.PedidoCompraItem;

/**
 *
 * @author André
 */
public class GerenciadorTabelas {

    private CotacaoPreco cotacaoPreco;
    private CotacaoPrecoMercadorias cotacaoMercadoriaToUpdate;
    private List<CotacaoPrecoMercadorias> vetorCotacaoPrecoMercadorias;
    private PedidoCompra pedidoCompra;
    private ArrayList<PedidoCompraItem> vetorPedidoCompraItem;
    private CondicaoCompra condicaoCompra;
    private CondicaoCompraParcela condicaoParcelaToUpdate;
    private List<CondicaoCompraParcela> vetorCondicaoCompraParcela;
    private static GerenciadorTabelas instance;
    private HashMap params;

    public static GerenciadorTabelas getInstance() {
        if (instance == null) {
            instance = new GerenciadorTabelas();
        }
        return instance;
    }

    private GerenciadorTabelas() {
        cotacaoPreco = new CotacaoPreco();
        vetorCotacaoPrecoMercadorias = new ArrayList<CotacaoPrecoMercadorias>();
        pedidoCompra = new PedidoCompra();
        vetorPedidoCompraItem = new ArrayList<PedidoCompraItem>();
        condicaoCompra = new CondicaoCompra();
        vetorCondicaoCompraParcela = new ArrayList<CondicaoCompraParcela>();
        params = new HashMap();
    }

    public HashMap getParams() {
        return params;
    }

    public void setParams(HashMap params) {
        this.params.putAll(params);
    }

    public void resetMap() {
        for (Object i : params.values()) {
            i = "";
        }
    }

    public CotacaoPreco getCotacao() {
        return cotacaoPreco;
    }
    
    public void setCotacao(CotacaoPreco cot) {
        this.cotacaoPreco = cot;
    }

    public CotacaoPrecoMercadorias getCotacaoMercadoriaToUpdate() {
        return cotacaoMercadoriaToUpdate;
    }

    public void setCotacaoMercadoriaToUpdate(CotacaoPrecoMercadorias cotacaoMercadoriaToUpdate) {
        this.cotacaoMercadoriaToUpdate = cotacaoMercadoriaToUpdate;
    }

    public CondicaoCompraParcela getCondicaoParcelaToUpdate() {
        return condicaoParcelaToUpdate;
    }

    public void setCondicaoParcelaToUpdate(CondicaoCompraParcela condicaoParcelaToUpdate) {
        this.condicaoParcelaToUpdate = condicaoParcelaToUpdate;
    }

    public List<CotacaoPrecoMercadorias> getCotacaoMercadorias() {
        return vetorCotacaoPrecoMercadorias;
    }

    public PedidoCompra getPedido() {
        return pedidoCompra;
    }

    public List<PedidoCompraItem> getPedidoItens() {
        return vetorPedidoCompraItem;
    }

    public CondicaoCompra getCondicao() {
        return condicaoCompra;
    }

    public void setCondicao(CondicaoCompra cond) {
        this.condicaoCompra = cond;
    }

    public List<CondicaoCompraParcela> getCondicaoParcelas() {
        return vetorCondicaoCompraParcela;
    }

    public void setCondicaoParcelas(List<CondicaoCompraParcela> vetorCondicaoCompraParcela) {
        this.vetorCondicaoCompraParcela = vetorCondicaoCompraParcela;
    }

    public void setCotacaoMercadorias(List<CotacaoPrecoMercadorias> vetorCotacaoPrecoMercadorias) {
        this.vetorCotacaoPrecoMercadorias = vetorCotacaoPrecoMercadorias;
    }

    public void atualizarCotacao(CotacaoPrecoMercadorias cotacaoMercadoriaUpdated, Integer tsequenciaPk){
        vetorCotacaoPrecoMercadorias.set(tsequenciaPk-1, cotacaoMercadoriaUpdated);
    }

    public void removerCotacao(int posicao){
        System.out.println("Antes: " + vetorCotacaoPrecoMercadorias.size());
        vetorCotacaoPrecoMercadorias.remove(posicao);
        System.out.println("Depois: " + vetorCotacaoPrecoMercadorias.size());
        
        for(int i = 0; i < vetorCotacaoPrecoMercadorias.size(); i++){
            vetorCotacaoPrecoMercadorias.get(i).setTsequencia_pk(i+1);
        }

    }

    public void removerParcela(int posicao){
        System.out.println("Antes: " + vetorCondicaoCompraParcela.size());
        vetorCondicaoCompraParcela.remove(posicao);
        System.out.println("Depois: " + vetorCondicaoCompraParcela.size());

        for(int i = 0; i < vetorCondicaoCompraParcela.size(); i++){
            vetorCondicaoCompraParcela.get(i).setTparcela_pk(i+1);
        }

    }

//    public CotacaoPrecoMercadorias getMercadoriaCotacao(Integer codMercadoria, Integer codFornecedor){
//        for(CotacaoPrecoMercadorias i : vetorCotacaoPrecoMercadorias){
//            if( (i.getTcodigo_mercadoria_fk() == codMercadoria) && (i.getTcodigo_fornecedor_fk() == codFornecedor) ){
//                System.out.println ("NO for: " + i);
//                return i;
//            }
//        }
//        System.out.println("dp do for: " + vetorCotacaoPrecoMercadorias.get(0).getTcodigo_mercadoria_fk());
//        return null;
//    }

//    public boolean salvarCotacao(CotacaoPreco cotacao) {
//        try {
//            List<CotacaoPrecoMercadorias> v = cotacao.getCotacaoPrecoMercadoriasList();
//            if (v.containsAll(vetorCotacaoPrecoMercadorias)) {
//                //as cotações estão batendo
//                cotacao.setTcodigo_pk(sequenceCotacao++);
//                vetorCotacaoPreco.add(cotacao);
//                vetorCotacaoPrecoMercadorias.clear();
//                System.out.println("Lista de cotMerc: " + cotacao.getCotacaoPrecoMercadoriasList());
//
//                return true;
//            }
//            System.err.println("Os vetores das cotações não estão batendo...");
//            return false;
//
//        } catch (Exception e) {
//            System.err.println(e);
//            return false;
//        }
//    }
//    public boolean atualizarCotacao(CotacaoPreco cotacao) {
//        try {
//            vetorCotacaoPreco.set(vetorCotacaoPreco.indexOf(cotacao), cotacao);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    public CotacaoPreco getCotacaoPorId(Integer id) {
//        for (CotacaoPreco i : vetorCotacaoPreco) {
//            if (i.getTcodigo_pk() == id) {
//                return i;
//            }
//        }
//        return null;
//    }
//
//    public boolean deletarCotacao(Integer id) {
//        try {
//            CotacaoPreco cotacao = null;
//            for (CotacaoPreco i : vetorCotacaoPreco) {
//                if (i.getTcodigo_pk() == id) {
//                    cotacao = i;
//                    break;
//                }
//            }
//            if (cotacao == null) {
//                System.err.println("Cotação não encontrada no vetor. Deveria encontrar");
//                return false;
//            }
//
//            return vetorCotacaoPreco.remove(cotacao);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    public boolean salvarPedido(PedidoCompra pedido) {
//        try {
//            List<PedidoCompraItem> v = pedido.getPedidoCompraItemList();
//            if (v.containsAll(vetorPedidoCompraItem)) {
//                //os pedidos estão batendo
//
//                //fazer as contas matemáticas que envolvem as tabelas mãe e filha
//                BigDecimal valorPedido = BigDecimal.ZERO;
//                BigDecimal descontoPerc = BigDecimal.ZERO;
//                BigDecimal descontoValor = BigDecimal.ZERO;
//                BigDecimal valorLiquido = BigDecimal.ZERO;
//                Integer qtdeItens = 0;
//
//                for (PedidoCompraItem i : v) {
//                    i.setTcod_pedido_fpk(sequencePedido);
//                    i.setTqtde_chegada(null);
//                    i.setTcodigo_original(null);
//                    i.setTvalor_total(i.getTpreco_compra().multiply(new BigDecimal(i.getTqtde_compra())));
//                    //o desconto foi dado em %
//                    if (!(i.getTdesconto_ped_perc().compareTo(BigDecimal.ZERO) == 0)) {
//                        i.setTpreco_compra_liquido(i.getTpreco_compra().multiply(i.getTdesconto_ped_perc()).divide(new BigDecimal(100)));
//                    } //o desconto foi dado em R$
//                    else if (!(i.getTdesconto_ped_valor().compareTo(BigDecimal.ZERO) == 0)) {
//                        i.setTpreco_compra_liquido(i.getTpreco_compra().subtract(i.getTdesconto_ped_valor()));
//                    } //não houve desconto
//                    else {
//                        i.setTpreco_compra_liquido(i.getTpreco_compra());
//                    }
//                    i.setTvalor_liquido(i.getTpreco_compra_liquido().multiply(new BigDecimal(i.getTqtde_compra())));
//
//                    valorPedido = valorPedido.add(i.getTvalor_total());
//                    valorLiquido = valorLiquido.add(i.getTvalor_liquido());
//                    qtdeItens = qtdeItens + i.getTqtde_compra();
//                }
//                descontoValor = valorPedido.subtract(valorLiquido);
//                descontoPerc = BigDecimal.ONE.subtract(valorLiquido.divide(valorPedido)).multiply(new BigDecimal(100));
//
//                pedido.setTvalor_pedido(valorPedido);
//                pedido.setTsaldo_a_entregar(valorPedido);
//                pedido.setTqtde_itens_merc(qtdeItens);
//                pedido.setTvalor_bruto(valorPedido);
//                pedido.setTdesconto_perc(descontoPerc);
//                pedido.setTdesconto_valor(descontoValor);
//                pedido.setTvalor_liquido_pedido(valorLiquido);
//
//                pedido.setTcodigo_pk(sequencePedido);
//                pedido.setTdata(new Date());
//                pedido.setTunidade_fk(1);
//                pedido.setTusuario_comprador_fk(1);
//                pedido.setTcotacao_fk(null);
//                vetorPedidoCompra.add(pedido);
//                vetorPedidoCompraItem.clear();
//                sequencePedido++;
//                System.out.println("Lista de PedidoItens: " + pedido.getPedidoCompraItemList());
//
//                return true;
//            }
//            System.err.println("Os vetores dos pedidos não estão batendo...");
//            return false;
//
//        } catch (Exception e) {
//            System.err.println(e);
//            return false;
//        }
//    }
//
//    public boolean atualizarPedido(PedidoCompra pedido) {
//        try {
//            vetorPedidoCompra.set(vetorPedidoCompra.indexOf(pedido), pedido);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    public PedidoCompra getPedidoPorId(Integer id) {
//        for (PedidoCompra i : vetorPedidoCompra) {
//            if (i.getTcodigo_pk() == id) {
//                return i;
//            }
//        }
//        return null;
//    }
//
//    public boolean deletarPedido(Integer id) {
//        try {
//            PedidoCompra pedido = null;
//            for (PedidoCompra i : vetorPedidoCompra) {
//                if (i.getTcodigo_pk() == id) {
//                    pedido = i;
//                    break;
//                }
//            }
//            if (pedido == null) {
//                System.err.println("Pedido não encontrado no vetor. Deveria encontrar");
//                return false;
//            }
//
//            return vetorPedidoCompra.remove(pedido);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//    public boolean salvarCondicao(CondicaoCompra condicao) {
//        try {
//            List<CondicaoCompraParcela> v = condicao.getCondicaoCompraParcelaList();
//            if (v.containsAll(vetorCondicaoCompraParcela)) {
//                //os pedidos estão batendo
//
//                //fazer as contas matemáticas que envolvem as tabelas mãe e filha
//                BigDecimal percentualParcelas = BigDecimal.ZERO;
//                int qtdeParcelas = 0;
//                for (CondicaoCompraParcela i : v) {
//                    percentualParcelas = percentualParcelas.add(i.getTpercentual_parcela());
//                    qtdeParcelas++;
//                    i.setTparcela_pk(qtdeParcelas);
//                }
//                if (percentualParcelas.compareTo(new BigDecimal("100.00")) != 0) {
//                    return false;   //as parcelas não batem 100,00%
//                }
//
//                condicao.setTquantidade_parcelas(qtdeParcelas);
//                condicao.setTcodigo_pk(sequenceCondicao++);
//                condicao.setTdata_cadastro(new Date());
//                vetorCondicaoCompra.add(condicao);
//                vetorCondicaoCompraParcela.clear();
//                System.out.println("Lista de CondicaoParcelas: " + condicao.getCondicaoCompraParcelaList());
//
//                return true;
//            }
//            System.err.println("Os vetores das condições não estão batendo...");
//            return false;
//
//        } catch (Exception e) {
//            System.err.println(e);
//            return false;
//        }
//    }
    public String validarCondicao(CondicaoCompra condicao) {
        try {
            List<CondicaoCompraParcela> v = condicao.getCondicaoCompraParcelaList();
            if (v.containsAll(vetorCondicaoCompraParcela)) {
                //os pedidos estão batendo

                //fazer as contas matemáticas que envolvem as tabelas mãe e filha
                BigDecimal percentualParcelas = BigDecimal.ZERO;
                int qtdeParcelas = 0;
                for (CondicaoCompraParcela i : v) {
                    percentualParcelas = percentualParcelas.add(i.getTpercentual_parcela());
                    qtdeParcelas++;
                    i.setTparcela_pk(qtdeParcelas);
                }
                if (percentualParcelas.compareTo(new BigDecimal("100.00")) != 0) {
                    return "As parcelas não batem 100,00%";
                }

                condicao.setTquantidade_parcelas(qtdeParcelas);

                return "";
            }
            System.err.println("Os vetores das condições não estão batendo...");
            return "Erro GT321. Informe ao Provedor!";

        } catch (Exception e) {
            System.err.println(e);
            return "Erro GT325. Informe ao Provedor!";
        }
    }

//    public boolean atualizarCondicao(CondicaoCompra condicao) {
//        try {
//            vetorCondicaoCompra.set(vetorCondicaoCompra.indexOf(condicao), condicao);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//    public CondicaoCompra getCondicaoPorId(Integer id) {
//        for (CondicaoCompra i : vetorCondicaoCompra) {
//            if (i.getTcodigo_pk() == id) {
//                return i;
//            }
//        }
//        return null;
//    }
//
//    public boolean deletarCondicao(Integer id) {
//        try {
//            CondicaoCompra condicao = null;
//            for (CondicaoCompra i : vetorCondicaoCompra) {
//                if (i.getTcodigo_pk() == id) {
//                    condicao = i;
//                    break;
//                }
//            }
//            if (condicao == null) {
//                System.err.println("Condição não encontrada no vetor. Deveria encontrar");
//                return false;
//            }
//
//            return vetorCondicaoCompra.remove(condicao);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
    public String validarPedido(PedidoCompra pedido) {
        try {
            List<PedidoCompraItem> v = pedido.getPedidoCompraItemList();
            if (v.containsAll(vetorPedidoCompraItem)) {
                //os pedidos estão batendo

                //fazer as contas matemáticas que envolvem as tabelas mãe e filha
                BigDecimal valorPedido = BigDecimal.ZERO;
                BigDecimal descontoPerc = BigDecimal.ZERO;
                BigDecimal descontoValor = BigDecimal.ZERO;
                BigDecimal valorLiquido = BigDecimal.ZERO;
                Integer qtdeItens = 0;

                for (PedidoCompraItem i : v) {
                    i.setTvalor_total(i.getTpreco_compra().multiply(new BigDecimal(i.getTqtde_compra())));
                    //o desconto foi dado em %
                    if (!(i.getTdesconto_ped_perc().compareTo(BigDecimal.ZERO) == 0)) {
                        i.setTpreco_compra_liquido(i.getTpreco_compra().multiply(i.getTdesconto_ped_perc()).divide(new BigDecimal(100)));
                    } //o desconto foi dado em R$
                    else if (!(i.getTdesconto_ped_valor().compareTo(BigDecimal.ZERO) == 0)) {
                        i.setTpreco_compra_liquido(i.getTpreco_compra().subtract(i.getTdesconto_ped_valor()));
                    } //não houve desconto
                    else {
                        i.setTpreco_compra_liquido(i.getTpreco_compra());
                    }
                    i.setTvalor_liquido(i.getTpreco_compra_liquido().multiply(new BigDecimal(i.getTqtde_compra())));

                    valorPedido = valorPedido.add(i.getTvalor_total());
                    valorLiquido = valorLiquido.add(i.getTvalor_liquido());
                    qtdeItens = qtdeItens + i.getTqtde_compra();
                }
                descontoValor = valorPedido.subtract(valorLiquido);
                descontoPerc = BigDecimal.ONE.subtract(valorLiquido.divide(valorPedido)).multiply(new BigDecimal(100));

                pedido.setTvalor_pedido(valorPedido);
                pedido.setTsaldo_a_entregar(valorPedido);
                pedido.setTqtde_itens_merc(qtdeItens);
                pedido.setTvalor_bruto(valorPedido);
                pedido.setTdesconto_perc(descontoPerc);
                pedido.setTdesconto_valor(descontoValor);
                pedido.setTvalor_liquido_pedido(valorLiquido);

                //quando vier o Login ai muda pro codUsuario 
                pedido.setTusuario_comprador_fk(1);

                return "";
            }
            System.err.println("Os vetores dos pedidos não estão batendo...");
            return "Erro GT417. Informe ao Provedor!";

        } catch (Exception e) {
            System.err.println(e);
            return "Erro GT421. Informe ao Provedor!";
        }
    }
}
